package chatNI;

import messages.*;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import chatControler.ChatControler;
import chatModel.*;

/**
 * Thread qui reçoit les messages
 * 
 */
public class ThreadUdpEcoute extends Thread {
	
	private DatagramSocket socketUdp;
	private ChatControler chatControler;
	private boolean actif;
	
	
	/**
         * Constructeur
         * @param socketUdp Socket dans lequel les messages à traiter sont reçus
         * @param chatControler ChatControler pour l'avertir qu'un message est reçu et qu'il doit être traité
         * @param actif True pour activer le thread false sinon
         */
	public ThreadUdpEcoute(DatagramSocket socketUdp, ChatControler chatControler, boolean actif) {
		super();
		this.socketUdp = socketUdp;
		this.chatControler = chatControler;
		this.actif=actif;
	}
	
        /**
         * Donne l'état du thread
         * @return true si le thread écoute le réseau false sinon
         */
	public boolean getActif(){
		return this.actif;
	}
	
        /**
         * Change l'état du thread
         * @param actif true pour l'activer, flase pour le désactiver
         */
	public void setActif(boolean actif){
		this.actif=actif;
	}
	
        /**
         * Lance le thread
         */
	public void run(){
		while(actif){
			receiveMsg(socketUdp);
		}
		System.out.println("reception fermée");
	}
	
        /**
         * Extrait les messages reçus et averti le ChatControler 
         * @see chatControler.ChatControler#traiterNewMsg(messages.Message) 
         * @param socketUdp Socket dans laquelle le thread extrait les messages
         */
	public void receiveMsg(DatagramSocket socketUdp){
		
		byte[] recvData;
		DatagramPacket myPacket;
		Message recvMessage;
		int size;
		
		try {
			size = socketUdp.getReceiveBufferSize();
			recvData = new byte[size];
			myPacket = new DatagramPacket(recvData, recvData.length);
			socketUdp.receive(myPacket);
			recvMessage = MessagesFactory.getMessage(myPacket.getData());
			
			// Il faut maintenant envoyer le message reçu au ChatControler pour savoir ce qu'il faut faire ensuite
			System.out.println("On a reçu un message de : " + recvMessage.getUsername());
			chatControler.traiterNewMsg(recvMessage);
			
		} catch (SocketException e) {
			System.out.println("erreur reception taille buffer");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Erreur reception");
			e.printStackTrace();
		} catch (MessageCreationException e) {
			e.printStackTrace();
		}
	}
	
	
	
}
